/********************************************************************************/
/*  boot.d																		*/
/*------------------------------------------------------------------------------*/
/*	製作		（　゜ワ゜）ノ　／　松久貫太									*/
/*	製作開始　	2007/05/11														*/
/*	MAIL		omega@personal.email.ne.jp										*/
/*	URL		http://nagoya.cool.ne.jp/o_mega										*/
/*																				*/
/*	このソースは「やわらかライセンス」の元で配布されています。					*/
/*-更新履歴---------------------------------------------------------------------*/
/*	2007/--/--																	*/
/*-その他-----------------------------------------------------------------------*/
/*	なし																		*/
/********************************************************************************/

/* ライブラリのインポート *******************************************************/
private import hell2;		// dHell2ライブラリ
private import state;
private import std.random;
private import std.string;
private import std.math;
private import std.math2;
private import std.stream;

/* グローバル定数定義 ***********************************************************/

// 画面サイズ
const int g_width = 640;
const int g_height = 480;
const char[] g_title = "tank";


/* Hell_main ********************************************************************/
/*	ヘルライブラリ・エントリポイント											*/
/*-引数-------------------------------------------------------------------------*/
/*	args		(i)	引数														*/
/*-返り値-----------------------------------------------------------------------*/
/*	int		実行結果															*/
/********************************************************************************/
int Hell_main(char[][] args)
{
	// オプション解釈
	bool is_fullscreen = true;
	foreach(int t,char[] buf;args)
	{
		//if(t == 0) continue;
		if(std.string.ifind(buf,"-w") > -1 || std.string.ifind(buf,"-window") > -1) is_fullscreen = false;
	}
	
	// メインループ
	try
	{
		Hell_init(g_title , g_width, g_height , is_fullscreen);
		load();
		while(true)
		{
			loop();
			Hell_update();
			Hell_wait(16); // 60fps
		}
	}
	catch(Exception e)
	{
		Hell_write(e);
	}
	finally
	{
		Hell_quit();
	}
	
	return 0;
}

/* main *************************************************************************/
/*	Win32エントリポイント														*/
/********************************************************************************/
version (Win32_release)
{
	private import std.c.windows.windows;
	private import std.string;

	extern (C) void gc_init();
	extern (C) void gc_term();
	extern (C) void _minit();
	extern (C) void _moduleCtor();

	extern (Windows)
	public int WinMain(HINSTANCE hInstance,
		HINSTANCE hPrevInstance,
		LPSTR lpCmdLine,
		int nCmdShow)
	{
		int result;
		gc_init();
		_minit();
		try
		{
			_moduleCtor();
			char exe[4096];
			GetModuleFileNameA(null, cast(char*)exe, 4096);
			char[][1] prog;
			prog[0] = std.string.toString(toStringz(exe));
			result  = Hell_main(prog ~ std.string.split(std.string.toString(lpCmdLine)));
		}
		catch(Object o)
		{
			printf(std.string.toStringz(o.toString()));
			result = 1;
		}
		gc_term();
		return result;
	}
}
else
{
	public int main(char[][] args)
	{
		return Hell_main(args);
	}
}

